
<HTML>

<HEAD>
<TITLE>Bugs fixed in V0.3-1</TITLE>
<LINK REV="made"     HREF="mailto:ronald@innovation.ch">
<LINK REL="Previous" HREF="index.html">
</HEAD>

<BODY BGCOLOR="#FFFFFF">

<H1>Contents</H1>
<UL>
<LI><A HREF="#bugs">Bugs fixed</A>
<LI><A HREF="#changes">Enhancements</A>
<LI><A HREF="#upgrading">Upgrading</A>
</UL>


<H1><A NAME="bugs">Bugs fixed in V0.3-1</A></H1>

<P>There were a number of bugs in the initial release of Version 0.3
which are fixed in this bug fix release:

<UL>
<LI>Bug in RedirectionModule fixed: a server redirecting to a new
    host name which mapped to the same IP-address as the old host
    name would be infinitely redirected.

<LI>The RedirectionModule was not doing the redirects properly when
    redirected to a new non IP-based virtual host (it was trying to
    be too smart).

<LI>URL parameters were being propagated in the RedirectionModule when
    they shouldn't be touched.

<LI>The context was not preserved when redirecting (i.e the new
    HTTPConnection was always using the default context).

<LI>Redirection bugs in HttpURLConnection fixed.

<LI><A HREF="api/HTTPClient.HttpURLConnection.html#getHeaderField(int)">HttpURLConnection.getHeaderField(0)</A>
    now returns the response status line;
    <A HREF="api/HTTPClient.HttpURLConnection.html#getHeaderFieldKey(int)">HttpURLConnection.getHeaderFieldKey(0)</A>
    returns null. This is undocumented, but the JDK 1.1.x and JDK 1.2
    behave that way.

<LI>Problem concerning firewalls in HttpURLConnection fixed: if you
    were behind a firewall and using a proxy to reach hosts for
    which you were unable to resolve the host name (as is often
    the case behind firewalls for hosts outside the firewall) then
    the constructor would throw an UnknownHostException. This fix
    also fixes problems when talking to non IP-based virtual hosts.

<LI>Cookie parser assumed weekday in expires attribute was 3 chars
    (as per spec); it now also handles non-abbreviated weekdays

<LI>Cookie header parsing had a bug which could generate an
    ArrayOutOfBoundsException.

<LI>IdempotentSequence fixed

<LI>Invoking HTTPConnection.stop() could cause a NullPointerException
    in StreamDemultiplexor.java.

<LI>EstablishConnection (defined in HTTPConnection.java) would get
    a NullPointerException if a Timeout was set and the connection
    failed after that.

<LI>only <var>Content-type: multipart/byteranges</var> was recognized;
    <var>Content-type: multipart/x-byteranges</var> was not due to a typo.

<LI>requestHandler invocation fixed - previously you couldn't return
    a new response. Also, public constructor added to Response so
    that a finished response can be created.

<LI>AuthorizationInfo: the realm was being trim()'d everywhere, which
    of course screwed up if your realm really started or ended with
    whitespace. Therefore, the trim()'s have been removed.

<LI>ContentEncoding module was only sending the tokens <var>gzip</var>
    and <var>compress</var>; it now also send <var>x-gzip</var> and
    <var>x-compress</var> (in addition)

<LI>Starting with JDK 1.2 Final <var>java.util.zip.InflaterInputStream</var>
    throws a NullPointerException in if passed a null stream.
    TransferEncodingModule.java and ContentEncodingModule.java now
    catch that.

<LI><A HREF="api/HTTPClient.Util.html#httpDate">Util.httpDate()</A> now
    generates dates correctly when the default Locale isn't "en" (i.e US,
    UK, etc).

<LI>TokenChar in Util was not defined correctly (included 128-255)

<LI>Kludge in Util.findStr() to work around VJ++ - this was in V0.2-3,
    but somehow didn't make it into V0.3

<LI>Constructor <A HREF="api/HTTPClient.HttpHeaderElement.html#HttpHeaderElement(java.lang.String, java.lang.String, HTTPClient.NVPair[])">HttpHeaderElement(String, String, NVPair[])</A>
    didn't make a copy of the <var>NVPair[]</var>.

</UL>


<H1><A NAME="changes">Enhancements and workarounds</A></H1>

<P>A number of enhancements and workarounds for buggy servers/scripts
have been incorporated into this bug fix too:

<UL>
<LI><A HREF="api/HTTPClient.HttpHeaderElement.html#toString">HttpHeaderElement.toString()</A>
    now only quotes if necessary

<LI>New <A HREF="api/HTTPClient.HttpURLConnection.html#setInstanceFollowRedirects">setInstanceFollowRedirects()</A>
    and <A HREF="api/HTTPClient.HttpURLConnection.html#getInstanceFollowRedirects">getInstanceFollowRedirects()</A>
    methods added to <A HREF="api/HTTPClient.HttpURLConnection.html">HttpURLConnection</A>
    to control redirection for the specific instance only.

<LI>Entity delimiter selection now updated to conform to HTTP/1.1-Rev.6
    (Transfer-Encoding adjustments)

<LI>Cookie2 class updated to rev-10 of the state management draft
    (introduction of the .local domain).

<LI>Cookie policy popup updated to handle Cookie2 requests

<LI><var>Proxy-Connection</var> header is correctly stripped when necessary

<LI>Minor hack for HotJava: if HttpURLConnection is running under
    HotJava then invoking getResponseCode() will also do a
    HTTPResponse.getData() if the status code is an error (&gt;= 300).
    HotJava has the nasty habit of not picking up its data.

<LI>HttpURLConnection now also reads the properties <var>nonProxyHosts</var>
    and <var>http.proxyHost</var> each time an instance is created;
    previously these were only read by HTTPConnection at class
    initialization time.

<LI>Digest Authentication handler updated to latest spec
    (draft-ietf-http-authentication-03.txt). Fully backwards compliant
    with rfc-2069.

<LI>Response header parser loosened a bit; it will now parse and accept
    invalid headers of the form "name value" (i.e. missing `:').

<LI>Cookie and Cookie2 parsers loosened a bit; previously domain
    attributes always had a dot prepended to them if they didn't
    already start with one. This is to prevent unwanted sharing of
    cookies between domains having similar names. However, in some
    cases the server set the domain attribute to be the same as the
    servers FQDN. When a dot was then prepended the domain attribute
    didn't tail match the servers FQDN anymore. Therefore this
    situation has been special-cased to not prepend a dot.

<LI>An invalid expires attribute in a Set-Cookie header is now ignored
    (i.e. treated as if there were no expires), instead of throwing
    a ProtocolException as was done previously.

<LI>Cookie parser changed with respect to accepting domain attributes.
    Previously, it followed Netscape's cookie spec which included the
    2/3 dot rule. Because this doesn't work well for many countries
    the rules have been changed to those used in Cookie2 (which also
    have their problems, but are certainly better).

<LI>The boundary parameter in Codecs.mpFormDataEncode() now does not
    quote the value part, i.e. instead of using
    Content-type: multipart/form-data; boundary="---....--"
    it now uses
    Content-type: multipart/form-data; boundary=---....--
    This is because there are just too many broken parsers out there
    which can't handle the parameter value being quoted. This is
    especially galling as RFC-2046 *recommends* the value be quoted.

<LI>Codecs: mpFormDataEncode() does not print the leading CR LR
    anymore - some (broken) parsers couldn't handle a preamble.

<LI>Codecs: new overloaded versions of
    <A HREF ="api/HTTPClient.Codecs.html#mpFormDataEncode(HTTPClient.NVPair[], HTTPClient.NVPair[], HTTPClient.NVPair[], HTTPClient.FilenameMangler)">mpFormDataEncode()</A> and
    <A HREF ="api/HTTPClient.Codecs.html#mpFormDataDecode(byte[], java.lang.String, java.lang.String, HTTPClient.FilenameMangler)">mpFormDataDecode()</A>
    are available which take a
    <A HREF="api/HTTPClient.FilenameMangler.html">FilenameMangler</A>
    as an additional argument. This mangler can be used to control
    the names of the resulting files stored, and the names put into
    the encoded data.

<LI>Only a single timeout thread is now used - it is shared by all
    connections. This should be a little more efficient...

<LI>new <A HREF="api/HTTPClient.URI.html">URI</A> class added. This
    class parses URLs correctly and implements correct equals(), but
    most importantly it does not require a URLStreamHandler to exist
    for the scheme. The client now uses URI internally instead of
    java.net.URL .

<LI>Added <A HREF="api/HTTPClient.HTTPResponse.html#getOriginalURI">getOriginalURI()</A>
    and <A HREF="api/HTTPClient.HTTPResponse.html#getEffectiveURI">getEffectiveURI()</A>
    to <A HREF="api/HTTPClient.HTTPResponse.html">HTTPResponse</A>.
    These both return URI's, and getEffectiveURI() returns the same as
    getOriginalURI() when no redirection took place (- to check for
    redirection, use
    <code>if (resp.getEffective() != resp.getOriginalURL())</code>

<LI><A HREF="api/HTTPClient.CookieModule.html">CookieModule</A> has
    three new methods: <A HREF="api/HTTPClient.CookieModule.html#listAllCookies">listAllCookies()</A>,
    which will return an array of all the currently stored cookies,
    <A HREF="api/HTTPClient.CookieModule.html#addCookie">addCookie()</A>
    to add a cookie to the list, and
    <A HREF="api/HTTPClient.CookieModule.html#removeCookie">removeCookie()</A>
    to remove a Cookie. In addition, the
    <A HREF="api/HTTPClient.Cookie.html">Cookie</A> and
    <A HREF="api/HTTPClient.Cookie2.html">Cookie2</A> classes each have a
    new public constructor.

<LI>Access to cookie lists now properly synchronized

<LI>Cookie may be saved and loaded again at startup by setting the
    new system property <var>HTTPClient.cookies.save</var> too
    <var>true</var>. The file used for saving files may be specified
    in the system property <var>HTTPClient.cookies.jar</var>; if this
    property is not set a system dependent name is chosen.

<LI><A HREF="api/HTTPClient.AuthorizationInfo.html">AuthorizationInfo</A>
    has two new methods:
    <A HREF="api/HTTPClient.AuthorizationInfo.html#getCookie">getCookie()</A>
    and
    <A HREF="api/HTTPClient.AuthorizationInfo.html#setCookie">setCookie()</A>.
    These manipulate the "cookie" when the simple form of the WWW-Authenticate
    and Authorization headers is used.

<LI>Parser and Realm attribute treatment loosened in AuthorizationInfo
    to allow for schemes which don't use the Realm.

<LI>AuthorizationInfo better documented, especially concerning the
    various fields and their uses.

</UL>


<H1><A NAME="upgrading">Upgrading from Version 0.3</A></H1>

<P>V0.3-1 should be plug-in compatible with V0.3. I.e. no changes to
your code are required unless you wish to make use of some of the new
features.


<P>
<A HREF="index.html">
<IMG SRC="images/back.gif" ALT="[HTTPClient]"></A>


<HR>
<ADDRESS>
Ronald Tschal&auml;r / 10. February 1999 / 
<A HREF="mailto:ronald@innovation.ch">ronald@innovation.ch</A>.
</ADDRESS>
 
</BODY>

</HTML>

